﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Plan;
using System.IO;

namespace PlanInterfejs
{
    public partial class PodsumowanieControl : UserControl
    {
        PlanView _view;

        public PlanView View
        {
            get { return _view; }
            set { _view = value; }
        }
        public PodsumowanieControl()
        {
            InitializeComponent();
            _view = new PlanView();
            _view.Algorithm.ReportProgress += new EventHandler<ReportProgressArgs>(Algorithm_ReportProgress);
        }

        void Algorithm_ReportProgress(object sender, ReportProgressArgs e)
        {
            progressBarPlanGenerate.Value = (int)(100 * e.Progress);
            textBoxShits.Text = e.LogMessage.Shits;
            if (e.Progress == 1)
                textBoxShits.Text += Environment.NewLine + Environment.NewLine + PlanDescription();
            //wilk syty i owca cała, chociaż DoEvents to nie jest najlepszy wybór.
            Application.DoEvents();

        }

        private string PlanDescription()
        {
            /*
                                    orderby planEntry.Zajecia.Godziny_Zajec.Czas_Poczatek
                       orderby planEntry.Zajecia.Dzien.Nr
             */
            var builder = new StringBuilder();
           /* foreach (var groupa in DAL.database.Grupa.OrderBy(g=>g.Nazwa))
            {
                var plan = from planEntry in DAL.database.Plan_Zajec
                           where planEntry.Grupa == groupa
                           orderby planEntry.Zajecia.Dzien, planEntry.Zajecia.Godziny_Zajec.Czas_Poczatek
                           select planEntry;
            }

                       
                       /*select new
                       {
                           Czas = planEntry.Zajecia.Godziny_Zajec.Czas_Poczatek,
                           Grupa = planEntry.Grupa.Nazwa,
                           Nauczyciel = planEntry.Zajecia.Nauczyciel.Imie + " " + planEntry.Zajecia.Nauczyciel.Nazwisko,
                           Przedmiot = planEntry.Zajecia.Przedmiot_Typy.Nazwa,
                           Dzien = planEntry.Zajecia.Dzien.Nazwa
                       };*/
                        var plan = from planEntry in DAL.database.Plan_Zajec
                                   orderby planEntry.Grupa.Nazwa, planEntry.Zajecia.Dzien.Nr, planEntry.Zajecia.Godziny_Zajec.Czas_Poczatek
                                   select new
                                   {
                                       Czas = planEntry.Zajecia.Godziny_Zajec.Czas_Poczatek,
                                       Grupa = planEntry.Grupa.Nazwa,
                                       Nauczyciel = planEntry.Zajecia.Nauczyciel.Imie + " " + planEntry.Zajecia.Nauczyciel.Nazwisko,
                                       Przedmiot = planEntry.Zajecia.Przedmiot_Typy.Nazwa,
                                       Dzien = planEntry.Zajecia.Dzien.Nazwa
                                   };
            foreach (var planEntry in plan)
            {
                builder.AppendLine(string.Format("grupa {0}, dzień {4} godz {1} przedmiot {2} naucz {3}", planEntry.Grupa, planEntry.Czas, planEntry.Przedmiot, planEntry.Nauczyciel, planEntry.Dzien));
            }
            return builder.ToString();
        }

        private void generatePlanButton_Click(object sender, EventArgs e)
        {
            progressBarPlanGenerate.Value = 0;
            _view.Algorithm.IterationCount = trbJakosc.Value * 5000; //int.Parse(textBoxIterationCount.Text);
            _view.Algorithm.ReportProgress += new EventHandler<ReportProgressArgs>(Algorithm_ReportProgress);

            _view.GeneratePlan();

        }

        private void button1_Click(object sender, EventArgs e)
        {
            //SchedulePdfCreator pdf = new SchedulePdfCreator();
            //pdf.create_empty_pdf();

            //ISchedulePdfCreator pdfKrijejtor = new SchedulePdfCreator();
            //foreach (var g in DAL.database.Grupa)
            //{
            //    pdfKrijejtor.GeneratePdf(g);
            //}
            
            //ISchedulePdf pdf = pdfKrijejtor.GeneratePdf(DAL.database.Grupa.First());
            MessageBox.Show("PDF zostal zapisany do pliq");
            //MessageBox.Show("PDF zostal zapisany do pliq: " + pdf.FileName);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //string res = ScheduleCSVGenerator.GenerateCSV(DAL.database.Grupa.First());
            //File.WriteAllText("planZajec.csv", res);
            //MessageBox.Show(res);
        }
        private void btnZapisz_Click(object sender, EventArgs e)
        {
            if (rbCSV.Checked)
            {
                DialogResult res = sfdCSV.ShowDialog(this);
                if (res == DialogResult.OK)
                {                    
                    foreach (var g in DAL.database.Grupa)
                    {
                        string csv = ScheduleCSVGenerator.GenerateCSV(g);
                        File.WriteAllText(Path.GetDirectoryName(sfdCSV.FileName) + "\\" + 
                            Path.GetFileNameWithoutExtension(sfdCSV.FileName) + "_" + 
                            g.Poziom_grupy + g.Nazwa + Path.GetExtension(sfdCSV.FileName), csv);
                    }
                }
            }
            else if (rbPDF.Checked)
            {
                DialogResult res = sfdPDF.ShowDialog(this);
                if (res == DialogResult.OK)
                {
                    ISchedulePdfCreator pdfKrijejtor = new SchedulePdfCreator();
                    foreach (var g in DAL.database.Grupa)
                    {
                        string sciezka = Path.GetDirectoryName(sfdPDF.FileName) + "\\" +
                            Path.GetFileNameWithoutExtension(sfdPDF.FileName) + "_" +
                            g.Poziom_grupy + g.Nazwa + Path.GetExtension(sfdPDF.FileName);
                        pdfKrijejtor.GeneratePdf(g, sciezka);
                    }
                }

            }
               
        }

        private void sfdCSV_FileOk(object sender, CancelEventArgs e)
        {

        }

        private void trbJakosc_Scroll(object sender, EventArgs e)
        {
            lblIteracje.Text = "Liczba iteracji: " + (trbJakosc.Value * 5000).ToString();
        }
  private void deleteButton_Click(object sender, EventArgs e)
        {
            var db = DAL.database;
            foreach (var pz in db.Plan_Zajec)
                db.Plan_Zajec.DeleteObject(pz);
            foreach (var pz in db.Zajecia)
                db.Zajecia.DeleteObject(pz);

            db.SaveChanges();
        }
    }
}
